#include "main.h"                  // Device header

void SystemCLK_Config(void){
    RCC_OscInitTypeDef RCC_OscInitStruct = {0};//晶振的数据结构--STM32上面是有一个外部晶振和内部高速晶振来保证HSE和HSI，上电复位默认使用内部高速晶振采用HSI时钟源
    RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};//这是SYSCLK的初始化数据结构
    
    RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2;//选取需要进行配置的总线时钟
    RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;//选取SYSCLK的时钟源为PLLCLK，请注意PLLCLK的来源为HSE
    RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;//AHB分频为1
    RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;//APB1分频为2，因为FCLK1时钟最大频率为42MHz
    RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;//APB2分频为1，没有什么限制

    while((HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2)) != HAL_OK);//FLASH_LATENCY取2即可，我们的处理器运行在电源电压为5的情况下，我们需要最大限度地保证运行速度

//    __HAL_RCC_PWR_CLK_ENABLE();//这个打开主要是为了之后的RTC备份啥的，暂时不深究，而且仅仅打开这个也不能实现备份
//    __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE2);//这个是为了电压负载优化，保证在处理器没有达到最大工作频率的时候供电不是那么强，达到省电的目的，但是STM32F401不支持SCALE1
    RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;//选取晶振类型
    RCC_OscInitStruct.HSIState = RCC_HSI_OFF;//失能内部晶振
    RCC_OscInitStruct.HSEState = RCC_HSE_ON;//使能外部晶振
    RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;//PLL锁相环使能
    RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;//PLL时钟来源设置为HSE
    RCC_OscInitStruct.PLL.PLLM = 8;     //
    RCC_OscInitStruct.PLL.PLLN = 168;   // 
    RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;//
    //以上将SYSCLK的时钟来源频率配置为了84MHz,而我们最终需要实现的是1ms的时间基准，根据手册，需要设置到Cortex System Timer的频率为10.5MHz
    
//    while(HAL_RCC_OscConfig(&RCC_OscInitStruct)!=HAL_OK);//配置RCC_Osc
    
    
//    RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2;//选取需要进行配置的总线时钟
//    RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;//选取SYSCLK的时钟源为PLLCLK，请注意PLLCLK的来源为HSE
//    RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;//AHB分频为1
//    RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;//APB1分频为2，因为FCLK1时钟最大频率为42MHz
//    RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;//APB2分频为1，没有什么限制

//    while((HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2)) != HAL_OK);//FLASH_LATENCY取2即可，我们的处理器运行在电源电压为5的情况下，我们需要最大限度地保证运行速度

    return;
}